#include "gsmcontrol.h"

#include <QDebug>

GSMcontrol::GSMcontrol(QObject *parent) :
    QObject(parent),
    isActive(FALSE),
    m_errorCount_CMGF(0),
    m_errorCount_CMGS(0),
    m_errorCount_Send(0)
  //isSending(0)
{
    m_timer.setInterval(5000);
    // m_timer.start(5000);
    connect(&m_timer,SIGNAL(timeout()),this,SLOT(slt_timeOut()));
    connect(this,SIGNAL(sig_error()),this,SLOT(slt_error()));
}
GSMcontrol::~GSMcontrol()
{
    foreach (const Message &t, m_queue) {
        DBcontrol::insertAuMes(t);

    }
}
/**
 * @brief GSMcontrol::slt_getMessage PDU最多为字符70个，这里实现了短信分割
 * @param me
 * @note 这边是存在bug隐患
 */
void GSMcontrol::slt_getMessage(const Message &me)
{
    /**
     *model不工作，不接受短信
     *
     *
     */
    qDebug() << me.getContent();

    if (!isActive) {

        //写入数据库
       // DBcontrol::insertAuMes(me);
        m_queue.append(me);
        return;
    }
    /**
     *分割部分
     */
    if (me.len() > 70) {
        int t = me.len() / 70;
        if (me.len() % 70 == 0) {

        } else {
            ++t;
        }
        for (int i = 0;i < t - 1;++i) {
            //            if (i == t - 1) {
            //                Message tm(me.getAddr(),me.getPhone(),me.getContent().mid(i*70));
            //                m_queue.append(tm);
            //            } else {
            //                Message tm(me.getAddr(),me.getPhone(),me.getContent().mid(i*70,70));
            //                m_queue.append(tm);
            //            }

            Message tm(me.getAddr(),me.getPhone(),me.getContent().mid(i*70,70));
            m_queue.append(tm);


        }
        Message tm(me.getAddr(),me.getPhone(),me.getContent().mid((t - 1)*70));
        m_queue.append(tm);


    } else {
        m_queue.append(me);
    }


    //    if (isSending) {
    //        m_currentPDU = GSMcontrol::toPDU(m_queue.first());
    //        emit sig_CMGF();
    //        isSending = true;
    //    }
}
/**
 * @brief GSMcontrol::slt_SendMessage
 * @param flag 接受的返回值，然后做相应的
 *
 *
 *
 */



void GSMcontrol::slt_SendMessage(int flag)
{
    switch (flag) {
    /*
     *检测AT+CMGF=0成功
     */
    case AT_CMGF_OK:{
        m_errorCount_CMGF = 0;
        emit sig_CMGS(m_currentPDU.getLen());

    }break;
        /*
         *
         *检测AT+CMGS=len成功
         */
    case AT_CMGS_OK:
        m_errorCount_CMGS = 0;
        emit sig_wirtePDU(m_currentPDU.getContent());
        // m_queue.pop_front();
        //        if (m_queue.length() > 0) {

        //        }
        //        isSending = false;
        break;
        /*
         *检测AT+CMGF=0失败
         */
    case AT_CMGF_ER:
        ++m_errorCount_CMGF;
        if (m_errorCount_CMGF == 10) {
            m_timer.stop();
            isActive = FALSE;
            emit sig_realTimeInfo(trUtf8("GSM-->发生不明错误，所有发送取消，存入数据库..."));
            emit sig_error();
        } else {
            emit sig_CMGF();
        }

        break;
        /*
         *检测AT+CMGS=len失败
         */
    case AT_CMGS_ER:
        ++m_errorCount_CMGS;
        if (m_errorCount_CMGS == 10) {
            m_timer.stop();
            isActive = FALSE;
            emit sig_realTimeInfo(trUtf8("GSM-->发生不明错误，所有发送取消，存入数据库..."));
            emit sig_error();
        } else {
            emit sig_CMGS(m_currentPDU.getLen());
        }

        break;
        /*
         *send_ok，删除信息，查看队列是否为空，不空继续，空设置标识
         */
    case AT_SEND_OK:
        m_errorCount_Send = 0;
        DBcontrol::insertAmes(m_queue.first());
        m_queue.pop_front();
        m_timer.start();
        emit sig_realTimeInfo(trUtf8("GSM-->一条信息发送成功!"));
        //        if (!m_queue.isEmpty()) {
        //            m_currentPDU = GSMcontrol::toPDU(m_queue.first());
        //            emit sig_CMGF();
        //        } else {
        //            isSending = false;
        //        }
        break;
        /*
         *send_er
         *
         */
    case AT_SEND_ER:
        ++m_errorCount_Send;
        if (m_errorCount_Send == 10) {
            m_timer.stop();
            isActive = FALSE;
            emit sig_realTimeInfo(trUtf8("GSM-->发生不明错误，所有发送取消，存入数据库..."));
            emit sig_error();
        } else {
            emit sig_CMGF();//从新发送
            emit sig_realTimeInfo(trUtf8("GSM-->信息发送失败，重新发送..."));
        }

        break;
    case AT_ERROR:
        /**
         * 短信猫不能在正常工作，关闭定时器
         *
         *
         */
        m_timer.stop();
        isActive = FALSE;
        emit sig_realTimeInfo(trUtf8("GSM-->短信猫不能工作!"));
        emit sig_error();
        break;
        /**
         *
         *短信猫正常工作
         *
         */
    case AT_OK:
        isActive = TRUE;
        m_timer.start();
        emit sig_realTimeInfo(trUtf8("GSM-->短信猫正常工作!"));
        break;
    default:
        break;
    }
}
/**
 * @brief GSMcontrol::toPDU
 * @param me
 * @return
 */
PDU GSMcontrol::toPDU(const Message &me)
{
    PDU p;

    QByteArray addr = CodeConvertor::changeAddr(me.getAddr());
    QByteArray phone = CodeConvertor::changePhone(me.getPhone());
    QByteArray content = CodeConvertor::_utf8ToUnicode(me.getContent().toLocal8Bit().data());
    int msgLen = content.length() / 2;
    char t[3] = {'\0'};
    if (msgLen < 15) {
        if (msgLen < 10) {
            t[0] = '0';
            t[1] = '0' + msgLen;
        } else {
            t[0] = '0';
            t[1] = msgLen - 10 + 'A';
        }
    } else {
        int low = msgLen % 16;
        if (low < 10) {
            t[1] = '0' + low;
        } else {
            t[1] = low - 10 +'A';
        }
        int hig = msgLen / 16;
        if (hig < 10) {
            t[0] = '0' + hig;
        } else {
            t[0] = hig - 10 +'A';
        }

    }
    //content = t + content;
    content.prepend(t);
    phone = "11000D91" + phone;
    phone = phone + "000800" + content;
    p.setLen(phone.length()/2);
    p.setContent(addr + phone);
    return p;
}

void GSMcontrol::slt_timeOut()
{
    if (m_queue.isEmpty()) {

    } else {
        m_timer.stop();
        m_currentPDU = GSMcontrol::toPDU(m_queue.first());
        emit sig_CMGF();
    }
}
void GSMcontrol::slt_error()
{
    foreach (const Message &me, m_queue) {
        DBcontrol::insertAuMes(me);

    }
    m_queue.clear();

}
void GSMcontrol::restart()
{
    isActive = true;
}


//读取短信
void GSMcontrol::slt_timeOut_1()
{


}


